home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Multimedia / Movie3.0 / Source / xanim / aux.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-02  |  11.2 KB  |  323 lines

  1. /*
  2.  *  some useful definitions for memory allocation and string
  3.  *  handling
  4.  */
  5.  
  6. #ifndef AUX_INCLUDED
  7. #define AUX_INCLUDED
  8.  
  9. #define DOUBLEREAL 1
  10.  
  11. #ifdef DOUBLEREAL
  12. typedef double real;
  13. #else
  14. typedef float real;
  15. #endif
  16.  
  17. #define pi 3.141592654
  18. #define qval 1.602e-19
  19. #define sqrt0_75 0.866025403784
  20. #define sqrt3_0 1.732050807569
  21. #define efac (real)332.0636
  22. #define undef (real)9999.99
  23.  
  24. typedef unsigned short Index;
  25. #define noIndex (Index)65535
  26.  
  27. typedef unsigned char bool;
  28.  
  29.  
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include <stdarg.h>
  33. #include <strings.h>
  34. #include <ctype.h>
  35. #include <math.h>
  36.  
  37. #ifdef SUN
  38. #include <unistd.h>
  39. #endif
  40. #ifdef IRIS
  41. #include <bstring.h>
  42. #include <malloc.h>
  43. #include <limits.h>
  44. #endif
  45. /* #ifdef HP
  46. #include <string.h>
  47. #endif
  48. */
  49.  
  50. #ifdef IRIS
  51. extern void *malloc(size_t);
  52. extern void *realloc(void *, size_t);
  53. extern  void free(void *p);
  54. #define usleep(t) sginap((long)(((t)*CLK_TCK)/1000))
  55. #endif
  56.  
  57. #ifdef NEXT
  58. #include <libc.h>
  59. #define HZ 60
  60. #endif
  61. #include <math.h>
  62.  
  63. #ifndef MODNAME
  64. #define MODNAME "unknown"
  65. #endif
  66.  
  67. #ifndef NOANSI
  68. #define assert(expr) if (!(expr)) error("%s: Assertion failed: "#expr".", MODNAME)
  69. #else
  70. #define assert(expr) if (!(expr)) error("%s: Assertion failed: expr.", MODNAME)
  71. #endif
  72.  
  73. #define arr_debug(arr) { \
  74.     debug(#arr": p=%x, len=%d, max=%d.\n",(arr).p, (arr).len, (arr).max); }
  75. #define DEB_NONE 0
  76. #define DEB_CPU 1
  77. #define DEB_REAL 2
  78. #define DEB_MEM 3
  79. #define DEB_ALL 4
  80.  
  81. #define debug pdebug
  82. #define ndebug npdebug
  83.  
  84. extern char *deb_pref;
  85. extern int deb_mode;
  86. extern void deb_print(char *s);
  87.  
  88. #define DEB_EXIT 0
  89. #define DEB_CORE 1
  90. extern int deb_crash;
  91.  
  92. #if PARIX
  93. #define bcopy(b1, b2, len) { register char *b_p1, *b_p2, *b_l; \
  94.     for(b_p1=(char *)(b1), b_l=b_p1+len, b_p2=(char *)(b2); b_p1<b_l;) \
  95.     *(b_p2++)=*(b_p1++); }
  96. #define bzero(b1, len) { register char *b_p1, *b_l; \
  97.     for(b_p1=(char *)(b1), b_l=b_p1+len; b_p1<b_l;) \
  98.     *(b_p1++)='\0'; }
  99. extern char *rindex(char *s, char c);
  100. #else
  101. #ifdef SUN
  102. extern void vprintf();
  103. extern void vsprintf();
  104. extern void bcopy();
  105. extern void bzero();
  106. extern int _filbuf();  /* God knows why these are not in /usr/include or /usr/5include */
  107. #endif
  108. #endif
  109.  
  110. #define flags_set(flags, mask) flags |= (mask)
  111. #define flags_clear(flags, mask) flags &= ~(mask)
  112. #define flags_off(flags, mask) (!(flags&(mask)))
  113. #define flags_on(flags, mask) ((flags&(mask))==(mask))
  114.  
  115. #define max(a, b) ((a) > (b) ? (a) : (b))
  116. #define min(a, b) ((a) < (b) ? (a) : (b))
  117.  
  118. #define memory(str) if (memory_flag) { \
  119.     mddebug("Memory used in %s, %s: %d.\n", MODNAME, str, memsize()); }
  120.  
  121. #define arr_min 4
  122. #define arr_inc 4
  123.  
  124.  
  125. #define array(typ) struct { typ *p; int len, max; }
  126. #define sarray(typ) struct { typ *p; short unsigned len, max; }
  127. #define arr_init(arr) { (arr).p=0; (arr).max=0; (arr).len=0; } 
  128. #define arr_empty(arr) { (arr).len=0; }
  129.  
  130. #ifndef NOANSI
  131. #define arr_debug(arr) { \
  132.     debug(#arr": p=%x, len=%d, max=%d.\n",(arr).p, (arr).len, (arr).max); }
  133. #define arr_printf(arr) #arr"[%d/%d](%x)",(arr).len,(arr).max,(arr).p
  134. #define arr_alloc(arr, ind) { register int a_n=ind+1; \
  135.     if (!(arr).p) (arr).p = (void *)malloc(a_n*sizeof(*(arr).p)); \
  136.     else if (a_n!=(arr).max) (arr).p = (void *)realloc((arr).p, a_n*sizeof(*(arr).p)); \
  137.     if (!(arr).p) { perror("array"); error("Could not allocate "#arr" at "#ind"=%d.\n", (ind)); } \
  138.     mem_size+=(a_n-(arr).max)*sizeof(*(arr).p); \
  139. /*    for (a_n=(arr).max; a_n<=ind; a_n++) (arr).p[a_n]=0; */ (arr).max=(ind)+1; }
  140. #define arr_dim(arr, siz) { register int a_i=(siz); \
  141.     if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
  142.     error("Illegal array "#arr": p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
  143.     if (!a_i) arr_empty(arr) else {if ((a_i--)>(arr).max) arr_alloc(arr, a_i) (arr).len=a_i+1; }}
  144. #define arr_check(arr, ind) { register int a_i, a_ind=(ind); \
  145.     if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
  146.     error("Illegal array "#arr": p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
  147.     if (a_ind>=(arr).max) { \
  148.     for (a_i=(arr).max; a_ind>=a_i; a_i+=(a_i/arr_inc+1)); \
  149.     arr_alloc(arr, a_i); }}
  150. #else
  151. #define arr_debug(arr) { \
  152.     debug("arr: p=%x, len=%d, max=%d.\n",(arr).p, (arr).len, (arr).max); }
  153. #define arr_printf(arr) "arr[%d/%d](%x)",(arr).len,(arr).max,(arr).p
  154. #define arr_alloc(arr, ind) { register int a_n=ind+1; \
  155.     if (!(arr).p) (arr).p = (void *)malloc(a_n*sizeof(*(arr).p)); \
  156.     else if (a_n!=(arr).max) (arr).p = (void *)realloc((arr).p, a_n*sizeof(*(arr).p)); \
  157.     if (!(arr).p) { perror("array"); error("Could not allocate arr at ind=%d.\n", ind); } \
  158.     mem_size+=(a_n-(arr).max)*sizeof(*(arr).p); \
  159. /*    for (a_n=(arr).max; a_n<=ind; a_n++) (arr).p[a_n]=0;  */ (arr).max=(ind)+1; }
  160. #define arr_dim(arr, siz) { register int a_i=(siz); \
  161.     if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
  162.     error("Illegal array arr: p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
  163.     if (!a_i) arr_empty(arr) else {if ((a_i--)>(arr).max) arr_alloc(arr, a_i) (arr).len=a_i+1; }}
  164. #define arr_check(arr, ind) { register int a_i, a_ind=(ind); \
  165.     if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
  166.     error("Illegal array arr: p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
  167.     if (a_ind>=(arr).max) { \
  168.     for (a_i=(arr).max; a_ind>=a_i; a_i+=(a_i/arr_inc+1)); \
  169.     arr_alloc(arr, a_i); }}
  170. #endif        
  171.  
  172. #define arr_copy(arr1, arr2) { \
  173.     arr_init(arr1); \
  174.     arr_dim(arr1, (arr2).len); \
  175.     bcopy((char *)(arr2).p, (char *)(arr1).p, sizeof(*(arr2).p)*(arr2).len); }
  176.  
  177. #define arr_add(arr, elem) { arr_check(arr, (arr).len); (arr).p[(arr).len++]=(elem); }
  178. #define arr_add2(arr, arr2, elem) { arr_check(arr2, (arr).len-1); \
  179.     (arr2).p[(arr).len-1]=(elem); (arr2).len=(arr).len; }
  180. #define arr_free(arr) { \
  181.     if ((arr).p) { free((arr).p); mem_size-=(arr).max*sizeof(*(arr).p); } \
  182.     (arr).p=0; (arr).max=0; (arr).len=0; }
  183. #define arr_lfree(arr) { int a_i; \
  184.     for (a_i=0; a_i<(arr).len; a_i++) cfree((arr).p[a_i]); \
  185.     if ((arr).p) { free((arr).p); mem_size-=(arr).max*sizeof(*(arr).p)); } \
  186.     (arr).p=0; (arr).max=0; (arr).len=0; }
  187.     
  188. #define blank(chr) ((chr)==' ' || (chr)=='\t' || (chr)=='\n')
  189.  
  190. extern int mem_size;
  191.  
  192. #ifndef NOANSI
  193. #define m_alloc(ptr,num,typ) { int a_n=(num); \
  194.     if (a_n) ptr = (typ *)malloc(a_n*sizeof(typ)); else ptr=NULL; \
  195.     mem_size+=a_n*sizeof(typ); if (ptr==NULL && a_n) \
  196.     error("Could not allocate ("#typ")"#ptr"["#num"=%d]", a_n); \
  197. }
  198. #define mfree(ptr, num, typ) { typ *a_p=NULL; int a_n=(num); \
  199.     if (ptr==a_p && a_n) error("Cannot free ("#typ")"#ptr"["#num"=%d]", a_n); \
  200.     if (a_n) free(ptr); ptr=NULL; mem_size-=a_n*sizeof(typ); \
  201. }
  202. #define mfree_o(ptr, ofs, num, typ) { typ *a_p=NULL; int a_n=(num); \
  203.     if (ptr==a_p && a_n) error("Cannot free ("#typ")"#ptr"["#num"=%d]", a_n); \
  204.     if (a_n) free(ptr+(ofs)); ptr=NULL; mem_size-=a_n*sizeof(typ); \
  205. }
  206. #define mext(ptr, num, num2, typ) { typ *a_p=NULL; int a_n1=(num), a_n2=(num2); \
  207.     if (ptr==a_p && a_n1) \
  208.     error("Cannot extend NULL ("#typ")"#ptr"["#num"=%d, "#num2"=%d]", a_n1, a_n2); \
  209.     if (a_n1 && a_n2) ptr = (typ *)realloc((char*)ptr, a_n2*sizeof(typ)); \
  210.     else if (a_n2) ptr = (typ *)malloc(a_n2*sizeof(typ)); else { free(ptr); ptr=NULL; } \
  211.     if (ptr==NULL && a_n2) \
  212.     error("Could not extend ("#typ")"#ptr"["#num"=%d, "#num2"=%d]", a_n1, a_n2); \
  213.     mem_size+=(a_n2-a_n1)*sizeof(typ); \
  214. }
  215. #else
  216. #define m_alloc(ptr, num, typ) { int a_n=(num); \
  217.     if (a_n) ptr = (typ *)malloc(a_n*sizeof(typ)); else ptr=NULL; \
  218.     mem_size+=a_n*sizeof(typ); if (ptr==NULL && a_n) \
  219.     error("Could not allocate (typ)ptr[num=%d]", a_n); \
  220. }
  221. #define mfree(ptr, num, typ) { typ *a_p=NULL; int a_n=(num); \
  222.     if (ptr==a_p && a_n) error("Cannot free (typ)ptr[num=%d]", a_n); \
  223.     if (a_n) free(ptr); ptr=NULL; mem_size-=a_n*sizeof(typ); \
  224. }
  225. #define mfree_o(ptr, ofs, num, typ) { typ *a_p=NULL; int a_n=(num); \
  226.     if (ptr==a_p && a_n) error("Cannot free (typ)ptr[num=%d]", a_n); \
  227.     if (a_n) free(ptr+(ofs)); ptr=NULL; mem_size-=a_n*sizeof(typ); \
  228. }
  229. #define mext(ptr, num, num2, typ) { typ *a_p=NULL; int a_n1=(num), a_n2=(num2); \
  230.     if (ptr==a_p && a_n1) \
  231.     error("Cannot extend NULL (typ)ptr[num=%d, num2=%d]", a_n1, a_n2); \
  232.     if (a_n1 && a_n2) ptr = (typ *)realloc((char*)ptr, a_n2*sizeof(typ)); \
  233.     else if (a_n2) ptr = (typ *)malloc(a_n2*sizeof(typ)); else { free(ptr); ptr=NULL; } \
  234.     if (ptr==NULL && a_n2) \
  235.     error("Could not extend (typ)ptr[num=%d, num2=%d]", a_n1, a_n2); \
  236.     mem_size+=(a_n2-a_n1)*sizeof(typ); \
  237. }
  238. #endif
  239. #define m_allocz(ptr,num,typ) { int z_n=(num); \
  240.     m_alloc(ptr, z_n, typ); \
  241.     bzero((char *)ptr, (z_n)*sizeof(typ)); }
  242.  
  243. #define mat_alloc(ptr, nx, ny, typ) { int m_i, m_x=(nx), m_y=(ny); typ **m_p; \
  244.     m_alloc(m_p, m_x, typ *); m_alloc(m_p[0], m_x*m_y, typ); \
  245.     for (m_i=1; m_i<m_x; m_i++) m_p[m_i] = m_p[m_i-1] + m_y; \
  246.     ptr = m_p;}
  247. #define mat_ext(ptr, nxo, nyo, nx, ny, typ) { \
  248.     int m_i, m_x=(nx), m_y=(ny), m_xo=(nxo), m_yo=(nyo); typ **m_p=(ptr); \
  249.     mext(m_p, m_xo, m_x, typ *); mext(m_p[0], m_xo*m_yo, m_x*m_y, typ); \
  250.     for (m_i=1; m_i<m_x; m_i++) m_p[m_i] = m_p[m_i-1] + m_y; \
  251.     ptr = m_p;}
  252. #define mat_free(ptr, nx, ny, typ) { int m_x=(nx), m_y=(ny); \
  253.     mfree((ptr)[0], m_x*m_y, typ); mfree(ptr, m_x, typ *); }
  254.  
  255.  
  256. #define aux_bufsiz 4098
  257.  
  258. extern char aux_buf[], aux_buf2[], *aux_bufp;
  259.  
  260. #define aux_bufstring(p) { unsigned l; \
  261.     p = aux_bufp; aux_bufp += (l=strlen(aux_buf))+1; \
  262.     if (aux_bufp>= aux_buf2+aux_bufsiz || aux_bufp < aux_buf2) \
  263.     { p=aux_buf2; aux_bufp=p+l+1; } \
  264.     strcpy(p, aux_buf); }
  265.     
  266. #define aux_bufnstring(p, n) { unsigned l=(n); \
  267.     p = aux_bufp; aux_bufp += l; \
  268.     if (aux_bufp>= aux_buf2+aux_bufsiz || aux_bufp < aux_buf2) \
  269.     { p=aux_buf2; aux_bufp=p+l; } \
  270.     bcopy(aux_buf, p, l); }
  271.     
  272. #define aux_sprintf(p, format) { va_list ap; \
  273.     va_start(ap, format); \
  274.     vsprintf(aux_buf, format, ap); \
  275.     va_end(ap); \
  276.     aux_bufstring(p); }
  277.  
  278.     
  279. #define check(ptr,num,defnum,typ) \
  280.   ptr = (typ *)checkalloc((char *)ptr,(num)*sizeof(typ),(defnum)*sizeof(typ))
  281. #define newstring(ptr,defnum) { ptr=NULL; check(ptr,1,defnum,char); ptr[0]='\0'; }
  282. #define cfree(ptr) if (ptr!=NULL) { free(ptr); ptr=NULL; }
  283. #define lfree(ptr) { int i; if (ptr!=NULL) for(i=0;ptr[i]!=NULL;i++) cfree(ptr[i]); }  
  284. #define nfree(ptr,n) { int i; if (ptr!=NULL) for(i=0;i<n;i++) cfree(ptr[i]); }  
  285. #define ncopy(ptr,len,typ)  (typ *)copydata((char *)ptr,(len)*sizeof(typ))
  286.  
  287. extern int debug_flag;
  288. extern int memory_flag;
  289.  
  290. extern real realtime();
  291. extern real cputime();
  292.  
  293. extern void warning(char *format, ...);
  294. extern void error(char *format, ...);
  295. extern void pdebug(char *format, ...);
  296. extern void npdebug(char *format, ...);
  297.  
  298. extern int memsize();
  299. extern char *checkalloc(); /* (char *p,int len,int deflen); */
  300. extern char *copy(); /* (const char *str); */
  301. extern char *stringf(char *format, ...);
  302. extern char *substr(const char *str, int ofs, int len);
  303. extern char *copydata(); /* (const char *str,int len); */
  304. extern char *append(); /* (char *s1,const char *s2); */
  305. extern FILE *ropen(); /* (const char *fn); */
  306. extern FILE *wopen(); /* (const char *fn); */
  307.       
  308. extern void time_init(void);
  309. extern void time_start(char *s);
  310. extern void time_seq(char *s);
  311. extern void time_stop(char *s);
  312. extern void time_reset(char *str);
  313. extern real time_val(char *str);
  314. extern real time_lap(char *str);
  315. extern char *time_string_lap(char *str);
  316. extern void time_print(void);
  317.  
  318. extern real ran_real(void);
  319.  
  320. extern char *s_lst(int* p, int len);
  321.  
  322. #endif
  323.